const iconv = require("iconv-lite");
const { cleanDatEnglishText } = require("./datTextCleaner");

/**
 * 将时间戳字符串转换为SRT格式的时间戳
 * @param {string} seconds - 以秒为单位的时间戳
 * @returns {string} SRT格式的时间戳 (HH:MM:SS,mmm)
 */
function convertTimeToSRTFormat(seconds) {
  const totalSeconds = parseFloat(seconds);
  const hours = Math.floor(totalSeconds / 3600);
  const minutes = Math.floor((totalSeconds % 3600) / 60);
  const secs = Math.floor(totalSeconds % 60);
  const milliseconds = Math.round((totalSeconds % 1) * 1000);

  return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")},${milliseconds.toString().padStart(3, "0")}`;
}

/**
 * 解析RTF编码的中文字符串
 * @param {string} rtfChinese - RTF编码的中文字符串
 * @returns {string} 解码后的中文字符串
 */
function decodeRTFChinese(rtfChinese) {
  // 如果字符串包含RTF编码格式（如\'xx\'xx）
  if (rtfChinese.includes("\\")) {
    try {
      // 提取所有\'xx形式的编码
      const hexCodes = rtfChinese.match(/\\'([0-9a-fA-F]{2})/g);
      if (hexCodes) {
        // 将编码转换为字节数组
        const bytes = hexCodes.map(code => parseInt(code.slice(2), 16));
        // 使用GBK解码
        const buffer = Buffer.from(bytes);
        return iconv.decode(buffer, "gbk");
      }
    } catch (error) {
      console.error("！！！Error decoding RTF Chinese:", error);
    }
  }
  // 如果不是RTF编码格式，直接返回原字符串
  return rtfChinese;
}

/**
 * 解析单个字幕条目
 * @param {string} entry - 原始条目字符串
 * @returns {object|null} 解析后的对象或null
 */
function parseEntry(entry) {
  // 移除开头和结尾的标记符号
  const cleanEntry = entry.replace(/^\*|\*$/g, "");
  if (!cleanEntry) return null;

  // 分割为英语部分和元数据部分
  const parts = cleanEntry.split("#");
  if (parts.length < 3) return null;

  // 提取英语文本
  const englishPart = parts[0];
  // 提取中文翻译
  const chinesePart = parts[1];
  // 提取时间戳
  const timestamps = parts.slice(2);

  if (timestamps.length < 2) return null;

  // 清理英语文本
  const englishText = cleanDatEnglishText(englishPart);

  return {
    english: englishText,
    chinese: chinesePart,
    startTime: convertTimeToSRTFormat(timestamps[0]),
    endTime: convertTimeToSRTFormat(timestamps[1]),
  };
}

module.exports = {
  convertTimeToSRTFormat,
  decodeRTFChinese,
  parseEntry,
};
